const dayjs = require('dayjs');
/**
 * 通用工具类
 */

/**
 * 获取当前时间戳
 */
function time() {
    return Math.floor(dayjs().valueOf() / 1000);
}

/**
 * 获取格式化的日期
 * @param {string} fmt 格式
 * @param {Object} date Day.js对象
 */
function timeFormat(fmt, date) {
    let ret;
    let opt = {
        "Y+": date.year(),        // 年
        "M+": date.month() + 1,   // 月
        "D+": date.date(),        // 日
        "h+": date.hour(),        // 时
        "m+": date.minute(),      // 分
        "s+": date.second()       // 秒
    };
    for (let k in opt) {
        ret = new RegExp("(" + k + ")").exec(fmt);
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].toString().padStart(ret[1].length, "0")));
        }
    }
    return fmt;
}

/**
 * 格式化日期字符串
 * @param {number|string} timestamp 时间戳或日期字符串
 * @param {string} format 格式
 */
function formatDate(timestamp, format = 'Y-M-D h:m:s') {
    if (!timestamp) return '';
    
    let date;
    if (typeof timestamp === 'string') {
        date = dayjs(timestamp);
    } else {
        date = dayjs(timestamp * 1000);
    }
    
    return timeFormat(format, date);
}

/**
 * 深拷贝对象
 * @param {Object} obj 需要拷贝的对象
 */
function deepClone(obj) {
    if (obj === null || typeof obj !== 'object') return obj;
    
    let result;
    if (Array.isArray(obj)) {
        result = [];
    } else {
        result = {};
    }
    
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            result[key] = deepClone(obj[key]);
        }
    }
    
    return result;
}

/**
 * 生成随机字符串
 * @param {number} length 长度
 */
function randomString(length = 32) {
    const chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
    let result = '';
    for (let i = 0; i < length; i++) {
        result += chars.charAt(Math.floor(Math.random() * chars.length));
    }
    return result;
}

/**
 * 获取IP地址
 * 小程序环境下返回默认值
 */
function getIP() {
    return '127.0.0.1';
}

/**
 * 判断变量是否定义
 * @param {*} val 变量
 */
function isDefined(val) {
    if (val === null) return false;
    if (val === undefined) return false;
    return true;
}

module.exports = {
    time,
    timeFormat,
    formatDate,
    deepClone,
    randomString,
    getIP,
    isDefined
}; 